/*  
  -- The Lime II Project -- 

  A tuplespaces-based middleware for coordinating agents and mobile hosts.
  Copyright (C) 2005.
  Gian Pietro Picco, Amy L. Murphy, Lorenzo Bellini.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.

  You should have received this copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
 */

package lime2;

import lights.interfaces.ITuple;

/**
 * The listener within a local reaction installed by the Lime system because of
 * an in or rd towards the local projection of the tuplespace.
 * 
 * @author Gian Pietro Picco
 * @author Amy Murphy
 * @author Lorenzo Bellini
 */

class SystemLocalBlocking extends SystemListener {
	// private data members
	private LimeTSMgr ltsm;
	private TupleOp op;

	/**
	 * Constructor method.
	 * 
	 * @param ltsm
	 *            the LimeTSMgr of this tuplespace
	 * @param op
	 *            the TupleOp that required the installation of the system
	 *            reaction
	 */
	SystemLocalBlocking(LimeTSMgr ltsm, TupleOp op) {
		this.ltsm = ltsm;
		this.op = op;
	}

	/**
	 * This method is invoked automatically by the Lime system when the
	 * corresponding reaction must fire.
	 * 
	 * @param re
	 *            ReactionEvent
	 */
	public void reactsToOut(ReactionEvent re) {
		// we can use "re" as a template since strong reactions are atomic
		ITuple tuple = re.getTuple();
		if (ltsm instanceof OptimizedLimeTSMgr) {
			OptimizedLimeTSMgr oltsm = (OptimizedLimeTSMgr) ltsm;
			oltsm.reactor.post(op.type, tuple);
		}
		switch (op.type) {
		// IN
		case (LimeConstants.IN):
			op.result.set(ltsm.doTake(tuple));
			op.result.lock.release();
			break;
		// RD
		case (LimeConstants.RD):
			op.result.set(tuple);
			op.result.lock.release();
			break;
		}
	}

}
